package com.kexio.file.mapper;

import java.time.LocalDateTime;
import java.util.List;

import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.kexio.file.entity.ShareLink;

/**
 * 文件分享链接 - 数据访问层
 * 
 * @author Kexio Team  
 * @since 1.0.0
 */
@Mapper
public interface ShareLinkMapper extends BaseMapper<ShareLink> {

    /**
     * 根据分享码查询分享链接
     *
     * @param shareCode 分享码
     * @return 分享链接
     */
    ShareLink selectByShareCode(@Param("shareCode") String shareCode);

    /**
     * 根据文件ID查询所有分享链接
     *
     * @param fileId 文件ID
     * @return 分享链接列表
     */
    List<ShareLink> selectByFileId(@Param("fileId") String fileId);

    /**
     * 根据文件ID查询有效的分享链接
     *
     * @param fileId 文件ID
     * @param currentTime 当前时间
     * @return 有效分享链接列表
     */
    List<ShareLink> selectValidByFileId(@Param("fileId") String fileId, 
                                        @Param("currentTime") LocalDateTime currentTime);

    /**
     * 根据创建者ID查询分享链接
     *
     * @param creatorId 创建者ID
     * @param limit 限制数量
     * @return 分享链接列表
     */
    List<ShareLink> selectByCreatorId(@Param("creatorId") String creatorId, 
                                      @Param("limit") Integer limit);

    /**
     * 更新分享链接访问统计
     *
     * @param shareId 分享ID
     * @param accessTime 访问时间
     * @param accessIp 访问IP
     * @return 影响行数
     */
    int updateAccessStats(@Param("shareId") String shareId, 
                          @Param("accessTime") LocalDateTime accessTime,
                          @Param("accessIp") String accessIp);

    /**
     * 更新分享链接下载统计
     *
     * @param shareId 分享ID
     * @param downloadTime 下载时间
     * @param downloadIp 下载IP
     * @return 影响行数
     */
    int updateDownloadStats(@Param("shareId") String shareId, 
                            @Param("downloadTime") LocalDateTime downloadTime,
                            @Param("downloadIp") String downloadIp);

    /**
     * 查询过期的分享链接
     *
     * @param currentTime 当前时间
     * @param limit 限制数量
     * @return 过期分享链接列表
     */
    List<ShareLink> selectExpiredLinks(@Param("currentTime") LocalDateTime currentTime, 
                                       @Param("limit") Integer limit);

    /**
     * 查询访问次数已达上限的分享链接
     *
     * @param limit 限制数量
     * @return 访问次数已达上限的分享链接列表
     */
    List<ShareLink> selectAccessLimitReachedLinks(@Param("limit") Integer limit);

    /**
     * 批量更新分享链接状态
     *
     * @param shareIds 分享ID列表
     * @param status 新状态
     * @return 影响行数
     */
    int batchUpdateStatus(@Param("shareIds") List<String> shareIds, 
                          @Param("status") Integer status);

    /**
     * 根据文件ID删除所有分享链接（软删除）
     *
     * @param fileId 文件ID
     * @return 影响行数
     */
    int deleteByFileId(@Param("fileId") String fileId);

    /**
     * 统计用户创建的分享链接数量
     *
     * @param creatorId 创建者ID
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 分享链接数量
     */
    int countByCreatorIdAndTimeRange(@Param("creatorId") String creatorId,
                                     @Param("startTime") LocalDateTime startTime,
                                     @Param("endTime") LocalDateTime endTime);

    /**
     * 查询热门分享链接（按访问次数排序）
     *
     * @param limit 限制数量
     * @param days 统计天数
     * @return 热门分享链接列表
     */
    List<ShareLink> selectPopularLinks(@Param("limit") Integer limit, 
                                       @Param("days") Integer days);
}
